# -*- coding: utf-8 -*-
# Created by 'Zhou Bingbing'  on 2019/7/24


import csv
def loadCsv(filename):
    lines=csv.reader(open(filename,'r',encoding='utf-8'))
    dataset= list(lines)
    for i in range(len(dataset)):
        dataset[i]=[float(x)for x in dataset[i][0].split(',')]
    return dataset
filename='pima-indians-diabetes.data.csv'
dataset=loadCsv(filename)

import random
def splitDataset(dataset,splitRatio):
    trainSize=int(len(dataset)*splitRatio)
    trainSet=[]
    copy=list(dataset)
    while len(trainSet)<trainSize:
        index= random.randrange(len(copy))
        trainSet.append(copy.pop(index))
    return trainSet,copy
splitRatio=0.7
train,test=splitDataset(dataset,splitRatio)
def separateByClass(dataset):
    separated={}
    for i in range(len(dataset)):
        vector=dataset[i]
        if vector[-1] not in separated:
            separated[vector[-1]]=[]
        separated[vector[-1]].append(vector)
    return separated

separated=separateByClass(dataset)
# print(separated)
import math
def mean(numbers):
    return sum(numbers)/float(len(numbers))
def stdev(numbers):
    avg = mean(numbers)
    variance=sum([pow(x-avg,2)for x in numbers])/float(len(numbers)-1)
    return math.sqrt(variance)
def summarize(dataset):
    summaries=[(mean(attribute),stdev(attribute)) for attribute in zip(*dataset)]
    del summaries[-1]
    return summaries
summary=summarize(dataset)

def summarizeByClass(dataset):
    separated = separateByClass(dataset)
    summaries={}
    for classValue,instances in separated.items():
        summaries[classValue]=summarize(instances)
    return summaries
summary = summarizeByClass(dataset)
print(summary)
import math
def calculateProbability(x,mean,stdev):
    exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2))))
    return (1/(math.sqrt(2*math.pi)*stdev))*exponent

def calculateClassProbabilities(summaries, inputVector):
    probabilities = {}
    for classValue, classSummaries in summaries.items():
        probabilities[classValue] = 1
        for i in range(len(classSummaries)):
            mean, stdev = classSummaries[i]
            x = inputVector[i]
            probabilities[classValue] *= calculateProbability(x, mean, stdev)
    return probabilities

def predict(summaries, inputVector):
    probabilities = calculateClassProbabilities(summaries, inputVector)
    bestLabel, bestProb = None, -1
    for classValue, probability in probabilities.items():
        if bestLabel is None or probability > bestProb:
            bestProb = probability
            bestLabel = classValue
    return bestLabel
def getPredictions(summaries,testSet):
    predictions=[]
    for i in range(len(testSet)):
        result=predict(summaries,testSet[i])
        predictions.append(result)
    return predictions
def getAccuracy(testSet, predictions):
    correct = 0
    for x in range(len(testSet)):
        if testSet[x][-1] == predictions[x]:
            correct += 1
    return (correct/float(len(testSet))) * 100.0
predictions=getPredictions(summary,test)
accuracy = getAccuracy(test, predictions)
print('Accuracy: {0}'.format(accuracy))